perm filename T3.F4[M11,LCS]5 blob sn#414631 filedate 1979-01-29 generic text, type T, neo UTF8
00100	      SUBROUTINE MSCAN
00200	CXX	DOUBLE PRECISION JFLNM,INST,INAM
00300	      DIMENSION TONES(21)
00400		COMMON LL  /P/W(1)
00500	CIN   COMMON /TR/I(80),RX(100),JX(100),LX(12),INST(27,4),K
00600	CC      COMMON /I/I(1) /TR/RX(80),JX(80),LX(12),K 
00700		COMMON /ROUT/I(200),RX(80),JX(80) /TR/LX(12),K
00800	     1,INSNUM(27),P(30),NPAR(27),JSEM,IPRNT,IPP
00900	     1,SRATE,RNCHN,RMAG,INUM,INS,MM,M,N,JJ,X,Y,IK
01000	     1,ENDX,J  /KNAM/IPLAY,JFLNM
01100		1 /INST/INST(1)
01200	      COMMON /SBFILN/SBFILN /AR/IOP /IGEN/IGEN /JP/JPRNT
01300	      INTEGER RPR
01400	      EQUIVALENCE (LESS,LX(9)),(W1,W(1)),(W2,W(2)),(W3,W(3)),(W4,W(4)),
01500	     1 (RX2,RX(3)),(P2,P(2)),(RX3,RX(5)),(I3,I(3))
01600	     1 ,(ISEMI,LX(2)),(IAST,LX(3))
01700	     1,(LPR,LX(11)),(RPR,LX(12)),(ICOM,LX(10)),(LAROW,LX(7))
01800	      DATA TONES/246.945,261.62,277.18,277.8,293.66,311.13,311.13,
01900	     1 329.63,349.23,329.63,349.23,369.99,369.99,
02000	     1 391.99,415.31,415.31,440.0,466.16,466.16,493.89,523.24/
02100	
02200	C**** CODE NUMS. 1=OUT 2=OSC 3=AD2 4=RAN 5=END 6=STR 7=AD3 8=AD4 9=MLT
02300	C**** 10=DIV 11=RAH 12=END 13=REV 14=OPT 15=NOS 16=SUB 17=INP  18=COS
02400	C**** B1=101 ETC.  P1=201 ETC.  F1=301 ETC. FREQ-PARAMS=600S, DURS=700S.
02500	C**** 400=PLAY 401=FINI 402=SRATE 403=NCHNS 404=PRINT 405=CHA 
02600	C**** 407=SRT 409=GEN 410=SEG 411=SIN  412=INS 413=UNIT GEN.
02700	C**** 500=CF 501=C 502=CS 503=DF 504=D 505=DS 506=EF 507=E 508=ES 509=FF
02800	C**** 510=F 511=FS 512=GF 513=G 514=GS 515=AF 516=A 517=AS 518=BF 519=B 520=BS
02900	
03000		JSEM=0
03100	C IS THIS NEEDED HERE?
03200	C JSEM=0 FOR 'PLAY' OR ASSIGNMENT ( P3←440;,  A=444; ETC.)
03300	      LL=1
03400	      INS=-1
03500	34      J=J+2      
03600	2324	FORMAT(1X20F10.3/)
03700	2325	FORMAT(1X20I/)
03800	2323	FORMAT(1X20A1/)
03900	      IXJ=JX(J)      
04000	      IPP=0             
04100	C!FOR 'P3←333;' ETC.
04200	      IOP=-1
04300	9      IF(J.GE.MM)GO TO 1001  
04400	      IF(RX(J+1).EQ.-9999.0)GO TO 11  
04500	C!*** SKIP IF NUMBER
04600	      IF(IGEN.GT.0)GO TO 450
04700	C IGEN=2=INSIDE AN INST. DEFINITION.
04800	
04900	C!***** LOOK FOR SPECIAL WORDS
05000		IF(IXJ/400.NE.1)GO TO 402
05100		K=IXJ-399
05200	C			   PRINT
05300	       GO TO (13,13,304,303,302,303,4,505,505,422,422,422,32)K
05400	C 	(PLAY) FINI SRAT NCHN   CHA   SRT     GEN SEG SIN INS
05500	32      W1=2
05600		IXJ=13
05700		JX(J)=13
05800	      IGEN=2
05900	      GO TO 424
06000	505      JK=4         
06100	C !**** FOR SRT
06200	      IF(K.NE.4)JK=2      
06300	      JK=J+JK
06400	      GO TO 304
06500	
06600	450	K=IXJ
06700	C** HERE FOR INST DEFINITIONS.
06800	CC	IF(K.LE.13.AND.K.GT.0)GO TO(425,425,425,425,425
06900	CC	1,425,425,425,425,425,425,411),K
07000	CC	IF(K.EQ.14)GO TO 425
07100	C 14='OPT' USER-ADDED UNIT GENERATOR.
07200		IF(K.EQ.12)GO TO 412
07300		IF(K.GT.0)GO TO 425
07400	CC503      JSEM=0
07500	CC      J=MM
07600	CC      RETURN   
07700		GO TO 1001
07800	504      FORMAT(' UNKNOWN SYMBOL ',A4)
07900	412       LL=3
08000	      IGEN=1   
08100	C!*** =1 IS FLAG TO CHANGE IT TO -1
08200	      J=MM
08300	      INS=-1
08400	      GO TO 10  
08500	422      W1=3   
08600	C!***** GEN
08700		IF(K.GT.10)W1=K-4
08800	C SEG=11, SIN=12  AT THIS POINT.
08900	      IGEN=0
09000	424      INS=-1
09100	      LL=2
09200	      GO TO 36
09300	425      W3=K+100
09400	436      LL=4  
09500	      GO TO 36
09600	
09700	CC3      J=J+2      
09800	C 'PLAY' IS NO LONGER NEEDED.
09900	C   !**** FOUND 'PLAY;'
10000	CC      IF(JX(J).NE.ISEMI)CALL ERR(1)
10100	C FLAG FOR 'TRANS' 
10200	CXXX  IPLAY=-1
10300	CC      IF(J.LT.MM)GO TO 34
10400	CC	PAUSE 'BEFORE LABEL 4'
10500	CC      RETURN
10600	4      JL=LL
10700	      JOP=IOP
10800	      J=J+2
10900	      IF(JX(J).NE.LPR)CALL ERR(2)
11000	      IOP=-1
11100	      GO TO 36  
11200	C!**FIND NUM UP TO THE COMMA
11300	302      LL=1
11400	      IPRNT=-1    
11500	C!***** FOR 'PRINT' FEATURE
11600	      GO TO 36
11700	304      SRATE=RX(J+4)
11800	      J=J+6
11900	      RMAG=512./SRATE
12000	      W3=4
12100	      W4=SRATE
12200	351      W1=11
12300	      W2=0
12400	      IGEN=0
12500	      LL=5
12600	C JSEM=-1  = SEND DATA BACK TO MUS5,PASS3.
12700	10	JSEM=-1
12800		RETURN
12900	CCC303      IF(IXJ.EQ.405)J=J-2
13000	303   RNCHN=RX(J+4)    
13100	C!**** FOR NCHNS←N;  OR  CHA ← N;
13200	      J=J+6
13300	CC      IF(RX(JK+1).NE.-9999.0)JK=JK+2  
13400	C!*** SKIP A COMMA
13500	CC      IF(JX(JK+2).EQ.ISEMI)GO TO 352  
13600	C!*** FOR NCHNS←n;
13700	352      W3=8            
13800	C!*** FOR NCHNS
13900	      W4=RNCHN-1
14000	      GO TO 351
14100	36      J=J+2      
14200	      IF(J.GT.MM)GO TO 1001        
14300	C!******  50 = DONE
14400	CC      JK=J*2
14500	CCC      IXJ=JX(J)      
14600	CX	TYPE 2324,RX(J+1)
14700	CX	TYPE 2323,IXJ
14800	CX	TYPE 2325,IXJ,IOP,IGEN
14900	CX	PAUSE 'LABEL 36'
15000		IF(IPLAY.LT.0)P(LL-3)=W(LL-1)
15100	C  **** LL HAD BETTER ALWAYS BE >3 HERE.
15200	C  FILL UP PARAM LIST WITH DATA FOLLOWING INST NAME.
15300	1002  	IXJ=JX(J)
15400		IF(IXJ.NE.ISEMI)GO TO 1
15500		IPLAY=0
15600	1000      IF(IPP.EQ.0)GO TO 10
15700	      P(IPP)=W1
15800	      LL=1
15900	      IPP=0
16000	      IF(J.LT.MM)GO TO 34  
16100	CC      IF(J.LT.MM)GO TO 30  
16200	      INS=-1   
16300	C!*** I HOPE THIS IS THE RIGHT PLACE FOR THIS.
16400	CX	PAUSE 'LABEL 1001'
16500	1001      JSEM=0
16600		RETURN
16700	
16800	1      IF(RX(J+1).NE.-9999.0)GO TO 2
16900	CX	TYPE 2325,IOP
17000	CX	PAUSE 'LABEL 1'
17100	11	IF(IOP.LT.0)GO TO 40
17200	      IF(IOP.NE.6)GO TO 12
17300	      RX(J)=-RX(J)  
17400	C!*** IOP=6 MEANS MINUS WITH COMMA IN FRONT
17500	      W(LL)=RX(J)
17600	      LL=LL+1
17700	      GO TO 14
17800	12	CALL ARITH(RX(J),W,LL)
17900	14      IOP=-1    
18000	C!*** RESET OPERATOR FLAG
18100	      GO TO 36   
18200	C!*** USE PARENTH'S FOR COMPOSITE EXPRESSIONS!!!!
18300	
18400	40	     W(LL)=RX(J)
18500	38      LL=LL+1
18600	      IF(IOP.LT.0)GO TO 36
18700	C IOP = NEG = NO OPERATOR BEFORE THIS ITEM.
18800	      LL=LL-1
18900	380      CALL ARITH(W(LL),W,LL)
19000	      GO TO 14
19100	
19200	C!**** READING CONTINUATION LINE.
19300	402	IF(IXJ.GE.0)GO TO 33
19400	C NEXT TRIES TO FIND INST. NAME.
19500	CIN	NA=-1-IXJ
19600	CIN	M=JX(J+1)
19700	C NA POINTS TO SPOT IN I ARRAY, M IS WDCNT.
19800		CALL PACKER(INAM,I(-IXJ))
19900		DO 233 IK=1,INUM
20000	233	IF(INST(IK).EQ.INAM)GO TO 333
20100		TYPE 504,INAM
20200		GO TO 33
20300	CIN	DO 133 IK=1,INUM
20400	CIN	DO 233 II=1,M
20500	CIN233	IF(INST(IK,II).NE.I(II+NA))GO TO 133
20600	C NOW WE FOUND AN INST. NAME.
20700	C******* INST NAMES CANNOT HAVE SAME STRING OF 1ST LETTERS AS OTHER THINGS.
20800	333	IPLAY=-1
20900	C FLAG TO START FILLING PARAMS.
21000	      W2=INSNUM(IK)      
21100	C!**** W IS P ARRAY IN MUSIC5
21200	      LL=3      
21300	C!**** W2 AND W3 WILL BE EXCHANGED LATER
21400		J=J+2
21500		GO TO 1002
21600	CC333	IF(M.EQ.4)GO TO 35
21700	CC	M=M+1
21800	CC	IF(INST(IK,M).EQ.0)GO TO 333
21900	CIN133	CONTINUE
22000	33    INS=2      
22100	C! NEXT IS SOMETHING OUTSIDE OF INST. AND PARAMS.
22200	
22300	2      IF(IGEN.GT.0)GO TO 427
22400		IF(IXJ.GT.520)GO TO 341
22500		IF(IXJ.LT.500)GO TO 427
22600	C NOW FOUND A NOTE
22700		K=IXJ-499
22800	      W(LL)=TONES(K)
22900	      GO TO 38
23000	C!***** FINDS NOTE IN SCALE
23100	
23200	C!****** FIND A PARAM NUM.
23300	427	IF(IXJ.GE.300)GO TO 307
23400		IF(IXJ.LT.200)GO TO 344
23500		K=IXJ-200
23600	C NOW K HAS PARAM NUM.
23700	      IF(INS.LE.0)GO TO 340
23800	      JK=J+2      
23900	      IF(JX(JK).NE.LAROW)GO TO 340
24000	      IPP=K
24100	      LL=1
24200	      J=JK      
24300	      GO TO 36
24400	340      W(LL)=P(K)      
24500	C!***** FOUND Pn
24600	      IF(IPRNT.LT.0)GO TO 38
24700	      IF(IGEN.GT.0)W(LL)=K+2.  
24800	C!*** PARAM NUMS ARE 2 LESS THAN IN BOOK.
24900	      GO TO 38    
25000	C!**** P4 IS CHANGED TO 6
25100	307    IF(IXJ.GE.400)GO TO 344
25200	
25300		IF(IXJ/300.NE.1)GO TO 344
25400		JL=IXJ-300
25500	      IF(IGEN.GT.0)JL=-JL-100      
25600	C!*** FOR Fn IN INST DEFINITION
25700	      W(LL)=JL
25800	      GO TO 38
25900	
26000	344      IF(IGEN.LE.0)GO TO 341
26100	C*** FOR B1, ETC. IN INST. DEFS.
26200		IF(IXJ/100.NE.1)GO TO 341
26300		 W(LL)=100-IXJ
26400	      GO TO 38
26500	
26600	341      DO 39 K=3,6
26700	      IF(LX(K).NE.IXJ)GO TO 39
26800		IF(K.NE.3)GO TO 342
26900		IF(JX(J+2).NE.IAST)GO TO 342
27000	C NOW FOUND 'X**Y', =X TO THE POWER OF Y
27100		K=7
27200		J=J+2
27300	342      IOP=K-2
27400	C IOP NUMS ARE: 1=+  2=-  3=*  4=/  5=**
27500	      JK=JX(J-2)
27600	      IF(JK.EQ.ICOM)IOP=6 
27700	C!** COMMA DISABLES NEXT OPERATOR
27800	      IF(JK.EQ.LAROW)IOP=6 
27900	C!**  ← DISABLES NEXT OPERATOR
28000	      IF(JK.EQ.LPR)IOP=6 
28100	C!** LFT PARENTH. DISABLES NEXT OPERATOR
28200	      GO TO 36
28300	39      CONTINUE
28400	308      IF(IXJ.EQ.LAROW)GO TO 36   
28500	C!*** PASS LEFT ARROW
28600		IF(IXJ.EQ.RPR)GO TO 500
28700		IF(IXJ.EQ.LPR)GO TO 500
28800	C LEFT AND RIGHT PARENTHESES
28900		IF(IXJ.NE.402)GO TO 510
29000	C 402=SRATE
29100		W(LL)=SRATE
29200	335      LL=LL+1
29300	      GO TO 36
29400	C**** OR SHOULD NEXT BE 403???
29500	510      IF(IXJ.NE.403)GO TO 511
29600	C 403-'NCHNS'
29700	      W(LL)=RNCHN
29800	      GO TO 335
29900	511      IF(IXJ.NE.ICOM)RETURN
30000	CC	GO TO 36
30100	CC511      IF(IXJ.NE.ICOM)GO TO 503       
30200	C!***** UNKNOWN CHAR.
30300	500      IF(IXJ.NE.LPR)GO TO 501
30400	      KOP=IOP
30500	      IOP=-1
30600	      JL=LL      
30700	C!**** SAVE VARIOUS POINTERS WHEN INSIDE PARENTHS.
30800	      GO TO 36
30900	501      IF(IXJ.NE.RPR)GO TO 502
31000	C!*** GET BACK STUFF
31100	      IOP=KOP
31200	      IF(IOP.LT.0)GO TO 36
31300	      LL=JL
31400	      GO TO 380      
31500	C!GO DO ARITHMETIC
31600	502      IF(IPRNT)GO TO 36     
31700	C!**** FOUND COMMA IN PRINT STATEMENT.
31800	5      IF(JX(J-2).NE.ICOM)GO TO 132
31900	433      W(LL)=P(LL-2)   
32000	C!** ONLY CARES ABOUT 2 COMMAS IN A ROW
32100	      GO TO 335
32200	132      IF(INS.GE.0)GO TO 36
32300	CC      IF(LL.EQ.3)GO TO 433      
32310	        IF(LL.NE.3.OR.IGEN.GE.0)GO TO 36      
32400	C!*** =3 MEANS COMMA FOR P1. (CHECK "IGEN" ABOVE ?)
32550		GO TO 433
32600	
32700	13      LL=2
32800	      W1=6
32900	CC      W2=ENDX+.5   
33000		W2=ENDX
33100	C!***** ENDX IS P1+P2 OF THE LONGEST LASTING INST.
33200	      IF(JPRNT)TYPE 51,LL,W1,W2
33300	130      J=MM
33400	C!*** WON'T READ LINE BEYOND 'FINISH;'  ***************
33500	      ENDX=-1
33600	51      FORMAT(I3,35F10.3)
33700	      END
33800